package repository

import (
	"gorm.io/gorm"
	"shop-bean/model"
	"shop-common/utils/pagehelper"
	"shop-common/utils/queryWrapper"
)

type IProdTagRepository interface {
	CheckExistByProdTag(*gorm.DB, *queryWrapper.WherePair) (bool, error)
	UpdateById(*gorm.DB, uint, map[string]interface{}) error
	Updates(db *gorm.DB, id uint, columns map[string]interface{}) error
	Find(db *gorm.DB, pair *queryWrapper.WherePair) (list []*model.ProdTag, err error)
	FindById(db *gorm.DB, id uint) (prodTag *model.ProdTag, err error)
	Create(db *gorm.DB, prodTag *model.ProdTag) error
	Delete(db *gorm.DB, id uint) error
	FindPage(db *gorm.DB, params *pagehelper.Params) ([]*model.ProdTag, error)
	Count(db *gorm.DB, params *pagehelper.Params) (int64, error)
	FindByPair(db *gorm.DB, pair *queryWrapper.WherePair) ([]*model.ProdTag, error)
}

type ProdTagRepository struct{}

func NewProdTagRepository() IProdTagRepository {
	return &ProdTagRepository{}
}

func (r *ProdTagRepository) CheckExistByProdTag(db *gorm.DB, wp *queryWrapper.WherePair) (exist bool, err error) {
	var count int64
	err = db.Model(&model.ProdTag{}).Where(wp.Query, wp.Args...).Count(&count).Error
	if err != nil {
		return false, err
	}
	return count > 0, nil
}

func (r *ProdTagRepository) UpdateById(db *gorm.DB, id uint, columns map[string]interface{}) error {
	return db.Model(&model.ProdTag{}).Where("id = ?", id).Save(columns).Error
}

func (r *ProdTagRepository) Find(db *gorm.DB, pair *queryWrapper.WherePair) (list []*model.ProdTag, err error) {
	tx := db.Model(&model.ProdTag{})
	tx = queryWrapper.ReuseWherePair(tx, pair)
	return list, tx.Find(&list).Error
}

func (r *ProdTagRepository) FindById(db *gorm.DB, id uint) (prodTag *model.ProdTag, err error) {
	return prodTag, db.First(&prodTag, id).Error
}

func (r *ProdTagRepository) Create(db *gorm.DB, prodTag *model.ProdTag) error {
	return db.Create(&prodTag).Error
}

func (r *ProdTagRepository) Updates(db *gorm.DB, id uint, columns map[string]interface{}) error {
	return db.Model(&model.ProdTag{}).Where("id = ?", id).Updates(columns).Error
}

func (r *ProdTagRepository) Delete(db *gorm.DB, id uint) error {
	return db.Delete(&model.ProdTag{}, id).Error
}

func (r *ProdTagRepository) FindPage(db *gorm.DB, params *pagehelper.Params) (page []*model.ProdTag, err error) {
	tx := queryWrapper.ReuseWherePair(db.Model(&model.ProdTag{}), params.WherePair)
	return page, tx.Scopes(pagehelper.Paginate(params.Current, params.Size)).Find(&page).Error
}

func (r *ProdTagRepository) Count(db *gorm.DB, params *pagehelper.Params) (count int64, err error) {
	tx := queryWrapper.ReuseSelect(db.Model(&model.ProdTag{}), params.SelectFields)
	return count, queryWrapper.ReuseWherePair(tx, params.WherePair).Count(&count).Error
}

func (r *ProdTagRepository) FindByPair(db *gorm.DB, pair *queryWrapper.WherePair) (list []*model.ProdTag, err error) {
	return list, queryWrapper.ReuseWherePair(db.Model(&model.ProdTag{}), pair).Order("seq desc").Find(&list).Error
}
